package org.rcgwt.sample.client.validator;

import java.util.ArrayList;
import java.util.List;

import org.rcgwt.client.ui.fields.ValidatedTextField;
import org.rcgwt.client.ui.validator.messages.MessageDisplay;
import org.rcgwt.client.ui.validator.messages.MessageManager;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.resources.client.ResourceException;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

public class ValidatedTextFieldSample implements EntryPoint {

	private FlexTable table;

	private ValidatedTextField<Object> vtf;

	private MessageDisplay message;

	private MessageManager manager;

	private List<ValidatedTextField<Object>> fields;

	public static final String[] validatorTypes = { "noBlank", "skipBlank",
			"removeAccents", "scientificChecked", "scientificFormatted",
			"money", "number", "hour", "date", "date_test", "year", "alpha_fr",
			"alpha_fr_upper", "alpha_fr_lower", "alphaDigit_fr",
			"alphaDigit_fr_upper", "alphaDigit_fr_lower", "name", "civility",
			"email", "insee", "creditCard" };

	private static String[] detailsLabels = {
			"Contrôle de saisie d'un texte sans espaces",
			"Contrôle de la saisie et élimination des caractères espace (\" \") en début et fin de chaine",
			"Supprime les accents de l'entrée lors de la sortie du champ",
			"Vérifie si la structure de la saisie est cohérente a celle de la notation scientifique",
			"Formatte l'entrée en respectant la structure de la notation scientifique",
			"Formatte l'entrée en respectant la notation monétaire",
			"Contrôle et formattage de l'entrée pour la saisie d'un nombre",
			"Contrôle l'entrée pour la saisie d'une heure (modele 12h ou 24h)",
			"Contrôle l'entrée pour la saisie d'une date (comprise entre 2 dates)",
			"",
			"Contrôle l'entrée pour la saisie d'une année (comprise entre 2 années et formattée US ou EU)",
			"Contrôle l'entrée pour la saisie de caracteres alphabetiques francais",
			"Contrôle et formattage de l'entrée pour la saisie de caracteres alphabetiques majuscules francais",
			"Contrôle et formattage de l'entrée pour la saisie de caracteres alphabetiques minuscules francais",
			"Contrôle et formattage de l'entrée pour la saisie de caracteres alphanumeriques francais",
			"Contrôle et formattage de l'entrée pour la saisie de caracteres alphanumeriques majuscules francais",
			"Contrôle et formattage de l'entrée pour la saisie de caracteres alphanumeriques minuscules francais",
			"Contrôle et formattage de l'entrée pour la saisie d'un nom quelconque",
			"Contrôle et formattage de l'entrée pour la saisie d'un titre",
			"Contrôle et formattage de l'entrée pour la saisie d'une adresse email normée",
			"Contrôle et formattage de l'entrée pour la saisie d'un numero INSEE (Institut National de la Statistique et des études économiques).",
			"Contrôle et formattage de l'entrée pour la saisie d'un numero de Carte Bancaire." };

	public static final String[] input = { " bonjour", " bonj our ",
			"c'est gagné", "1.24E-10", "123.54", "-1200", "1200000", "23:34",
			"23/04/2010", "", "1951", "aa12Aa", "A2bZ", "aBz12", "AbZ123",
			"aBz123", "aBz", "durand", "M", "nom@domaine.com",
			"189101730012635", "5393019020627687" };

	public static final String[] output = { "bonjour", "bonjour",
			"c'est gagne", "1.24E-10", "1.2354E2", "- 1 200", "1 200 000",
			"23:34", "23 avr. 2010 00:00:00", "", "1951", "aaAa", "ABZ", "abz",
			"AbZ123", "ABZ123", "abz", "DURAND", "M", "nom@domaine.com",
			"1 89 10 17 300 126 35", "5393 0190 2062 7687" };

	private Label title;
	private Button r_button;

	@Override
	public void onModuleLoad() {
		RootPanel rp = RootPanel.get();
		table = new FlexTable();
		r_button = new Button("Valid");

		fields = new ArrayList<ValidatedTextField<Object>>();
		manager = MessageManager.create();

		// Details Labels instantiations
		title = new Label("ValidatedTextField Component ShowCase");
		title.setStyleName("validator-test-title");

		Label validatorNameHeading = new Label("Nom du Validateur");
		validatorNameHeading.setStyleName("validator-test-head-column");
		table.setWidget(0, 0, validatorNameHeading);
		// Validators Names
		for (int i = 0; i < validatorTypes.length; i++) {
			table.setText(i + 1, 0, formatDetailsLabel(validatorTypes[i]));
		}

		Label fieldsHeading = new Label("Champs");
		fieldsHeading.setStyleName("validator-test-head-column");
		table.setWidget(0, 1, fieldsHeading);
		// ValidatedTextFields
		for (int i = 0; i < validatorTypes.length; i++) {
			// Validated Text Fields instantiations
			vtf = new ValidatedTextField<Object>();
			message = new MessageDisplay();
			message.displayDetail(true);
			message.displaySummary(true);
			// Validated Text Fields configuration

			try {
				vtf.setValidator(validatorTypes[i]);
			} catch (ResourceException e) {
				e.printStackTrace();
			}
			manager.addField(vtf);
			manager.addMessageDisplay(message, vtf);

			fields.add(vtf);
			table.setWidget(i + 1, 1, vtf);
			table.setWidget(i + 1, 4, message);
		}

		Label detailsHeading = new Label("Details");
		detailsHeading.setStyleName("validator-test-head-column");
		table.setWidget(0, 2, detailsHeading);
		// Labels
		for (int i = 0; i < detailsLabels.length; i++) {
			table.setText(i + 1, 2, detailsLabels[i]);
		}

		Label resultsHeading = new Label("Resultats");
		resultsHeading.setStyleName("validator-test-head-column");
		table.setWidget(0, 3, resultsHeading);
		// Results
		for (int i = 0; i < input.length; i++) {
			table.setText(i + 1, 3, input[i] + " => " + output[i]);
		}

		// Messages
		Label MessagesHeading = new Label("Messages");
		MessagesHeading.setStyleName("validator-test-head-column");
		table.setWidget(0, 4, MessagesHeading);

		table.getColumnFormatter().setWidth(0, "150px");
		table.getColumnFormatter().setWidth(1, "190px");
		table.getColumnFormatter().setWidth(2, "800px");
		table.getColumnFormatter().setWidth(3, "400px");

		// Global error display
		message = new MessageDisplay();
		message.displayDetail(true);
		message.displaySummary(true);
		manager.addGlobalMessageDisplay(message);

		r_button.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				manager.valid();
			}
		});
		fields.get(0).setRequired(true);

		rp.add(title);
		rp.add(table);
		rp.add(r_button);
		rp.add(message);
	}

	public String formatDetailsLabel(String label) {
		String firstChar = String.valueOf(label.charAt(0)).toUpperCase();
		String others = label.substring(1);
		return firstChar + others;
	}
}
